package Negocio;

import java.io.Serializable;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Date;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;

import Controller.Controller;
import Interfaz.EnvioDTO;

@Entity
@DiscriminatorValue("EnvioInterSucursal")
public class EnvioInterSucursal extends Envio implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1812845039811631994L;
	@ManyToOne
	@JoinColumn(name="sucursal_origen_id")
	private Sucursal sucursalOrigen;
	@ManyToOne
	@JoinColumn(name="sucursal_destino_id")
	private Sucursal sucursalDestino;
	
	
	
	public EnvioInterSucursal() {
	}


	public EnvioInterSucursal(Cliente cliente,
			Sucursal sucursalOrigen, 
			Sucursal sucursalDestino,
			Date fechaRecepcion, 
			Date fechaEntregaComprometida, 
			Date fechaLimiteDeDespacho,
			String nombreDestinatario, 
			String apellidoDestinatario, 
			String dniDestinatario, 
			Float anchoCM, 
			Float altoCM, 
			Float profundidadCM, 
			Float pesoKG, 
			Float volumenM3, 
			Integer refrigerado,
			Integer fragilidad, 
			Integer peligrosidad, 
			Integer apilable,
			String especiales, 
			String manifiesto) {
		super();
		this.cliente = cliente;
		this.fechaRecepcion = fechaRecepcion;
		this.fechaEntregaComprometida = fechaEntregaComprometida;
		this.fechaLimiteDeDespacho = fechaLimiteDeDespacho;
		
		this.destinatarios = new ArrayList<Destinatario>();
		destinatarios.add(new Destinatario (nombreDestinatario, apellidoDestinatario, dniDestinatario));
		this.contratosConTerceros = new ArrayList<ContratoConTerceros>();
		
		this.carga = new Carga(anchoCM, altoCM, profundidadCM,
				 pesoKG, volumenM3, refrigerado,
				fragilidad, peligrosidad, apilable,
				especiales, manifiesto);
		this.sucursalOrigen = sucursalOrigen;
		this.sucursalDestino = sucursalDestino;
		
		sucursalOrigen.encolarPaqueteParaEnviar(this);
		this.precio = calcularPrecio();
	}


	public EnvioInterSucursal(Cliente cliente, Sucursal sucursalOrigen, Sucursal sucursalDestino, EnvioDTO envio) {
		super();
		this.cliente = cliente;
		this.fechaRecepcion = envio.getFechaRecepcion();
		this.fechaEntregaComprometida = envio.getFechaEntregaComprometida();
		this.fechaLimiteDeDespacho = envio.getFechaLimiteDeDespacho();
		
		this.destinatarios = new ArrayList<Destinatario>();
		destinatarios.add(new Destinatario (envio.getNombreDestinatario(), envio.getApellidoDestinatario(), envio.getDniDestinatario()));
		this.contratosConTerceros = new ArrayList<ContratoConTerceros>();
		
		this.carga = new Carga(envio.getAnchoCM(), envio.getAltoCM(), envio.getProfundidadCM(),
				 envio.getPesoKG(), envio.getVolumenM3(), envio.getRefrigerado(),
				envio.getFragilidad(), envio.getPeligrosidad(), envio.getApilable(),
				envio.getEspeciales(), envio.getManifiesto());
		this.sucursalOrigen = sucursalOrigen;
		this.sucursalDestino = sucursalDestino;
		this.enViaje = envio.isEnViaje();
		
		sucursalOrigen.encolarPaqueteParaEnviar(this);
	}


	public Sucursal getSucursalOrigen() {
		return sucursalOrigen;
	}


	public void setSucursalOrigen(Sucursal sucursalOrigen) {
		this.sucursalOrigen = sucursalOrigen;
	}


	public Sucursal getSucursalDestino() {
		return sucursalDestino;
	}


	public void setSucursalDestino(Sucursal sucursalDestino) {
		this.sucursalDestino = sucursalDestino;
	}
	
	public EnvioDTO getDTO() {
		if (dto == null) {
			String destinatarioNombre = "";
			String destinatarioApellido = "";
			String destinatarioDni = "";
			if (!destinatarios.isEmpty()) {
				destinatarioNombre = destinatarios.get(0).getNombre();
				destinatarioApellido = destinatarios.get(0).getApellido();
				destinatarioDni = destinatarios.get(0).getDni();
			}
			dto = new EnvioDTO(this.getId(), this.cliente.clienteId, fechaRecepcion, fechaEntregaComprometida, fechaLimiteDeDespacho, sucursalOrigen.getNombre(), sucursalDestino.getNombre(), destinatarioNombre, destinatarioApellido, destinatarioDni, carga.getAnchoCM(), carga.getAltoCM(), carga.getProfundidadCM(), carga.getPesoKG(), carga.getVolumenM3(), carga.getRefrigerado(), carga.getFragilidad(), carga.getPeligrosidad(), carga.getApilable(), carga.getEspeciales(), carga.getManifiesto(), this.entregado, this.enDestino, this.fechaEntregaReal, this.enViaje);		
			}
		return dto;
	}


	public float calcularPrecio() {
		float precio = 0;
		try {
			Ruta ruta = Controller.getInstance().buscarRuta(this.sucursalOrigen.getNombre(), this.sucursalDestino.getNombre());
			if (ruta != null) {
				precio = ruta.getPrecio();
			}
		} catch (RemoteException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return precio;
	}


	public void entregado() {
		this.entregado = true;
		this.fechaEntregaReal = new Date();
		this.sacarDelDeposito();
		this.sucursalDestino.sacarDelDeposito(this);
	}
}
